package com.info.zhiduoduo.shiro.filter;

import com.info.zhiduoduo.common.utils.HttpUtil;

import org.apache.shiro.web.filter.AccessControlFilter;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProcessOptionsFilter extends AccessControlFilter {

    /**
     * 如果processOptions返回的是true，证明请求是OPTIONS请求。
     * 注意：如果是OPTIONS请求，不能返回true，因为isAccessAllowed方法如果返回true，这个请求会直接请求到方法体上
     * (因为OPTIONS只是查看接口通不通，请求接口并不会带任何参数，如果直接请求到方法体上会报参数错误)
     * 所以这里OPTIONS请求只能返回false，如果返回true，证明不是OPTIONS请求，允许正常访问接口
     * 当isAccessAllowed返回false，回去请求onAccessDenied方法
     * @param request
     * @param response
     * @param mappedValue
     * @return
     */
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue){
        if (HttpUtil.processOptions((HttpServletRequest) request, (HttpServletResponse) response)) {
            return false;
        }
        return true;
    }


    /**
     * 这里会去判断请求是不是OPTIONS请求，如果是OPTIONS请求直接返回
     * 注意：这个方法返回false会返回到前端，返回true才会去请求具体方法
     * @param request
     * @param response
     * @return
     */
    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response){
        if (HttpUtil.processOptions((HttpServletRequest) request, (HttpServletResponse) response)) {
            return false;
        }
        return true;
    }
}

